package com.jielin.handling.util;

import org.apache.commons.lang.time.DateUtils;

import java.sql.Timestamp;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.ParsePosition;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.temporal.ChronoUnit;
import java.util.Calendar;
import java.util.Date;

/**
 * 类名称：DateUtil
 * 创建人：zhanglongdeng@163.com
 * 创建时间：2019年3月5日 下午3:06:58
 * 类描述：
 */
public class DateUtil {

    public static final String DATE_FORMAT_STR = "yyyyMMdd";
    public static final String DATE_FORMAT_BASE = "yyyy/MM/dd";
    public static final String DATE_FORMAT_REDUCE = "yyyy-MM-dd";
    public static final String DATE_FORMAT_BIAS = "yyyy/MM/dd/HH/mm";
    public static final String DATE_FORMAT_COLON = "yyyy:MM:dd HH:mm:ss";
    public static final String DATE_FORMAT_MINUS = "yyyy-MM-dd HH:mm:ss";
    public static final String DATE_FORMAT_NUMBER = "yyyyMMddHHmmss";
    public final static String LOCATE_DATE_FORMAT = "yyyyMMddHHmmss";
    public final static String DATE_FORMAT_CHINESE = "yyyy年MM月dd日";
    public final static String DATE_FORMAT_HOURS = "HH:mm:ss";


    /**
     * format DateMount with the given pattern
     *
     * @param date    the DateMount that want to format to string
     * @param pattern the formated pattern
     * @return the formated DateMount
     */
    public static String formatDate(Date date, String pattern) {
        SimpleDateFormat format = new SimpleDateFormat(pattern);
        return format.format(date);
    }

    /**
     * 格式化时间
     *
     * @return
     */
    public static String getFormatDate(Date date, String format) {
        DateFormat df = new SimpleDateFormat(format);
        return df.format(date);
    }

    //返回当前年月日   heyh
    public static String getNowDate() {
        Date date = new Date();
        String nowDate = new SimpleDateFormat("yyyy-MM-dd").format(date);
        return nowDate;
    }

    //返回当前年份	heyh
    public static int getYear() {
        Date date = new Date();
        String year = new SimpleDateFormat("yyyy").format(date);
        return Integer.parseInt(year);
    }

    //返回当前月份	heyh
    public static int getMonth() {
        Date date = new Date();
        String month = new SimpleDateFormat("MM").format(date);
        return Integer.parseInt(month);
    }

    //判断闰年	heyh
    public static boolean isLeap(int year) {
        if (((year % 100 == 0) && year % 400 == 0) || ((year % 100 != 0) && year % 4 == 0))
            return true;
        else
            return false;
    }

    //返回当月天数		heyh
    public static int getDays(int year, int month) {
        int days;
        int FebDay = 28;
        if (isLeap(year))
            FebDay = 29;
        switch (month) {
            case 1:
            case 3:
            case 5:
            case 7:
            case 8:
            case 10:
            case 12:
                days = 31;
                break;
            case 4:
            case 6:
            case 9:
            case 11:
                days = 30;
                break;
            case 2:
                days = FebDay;
                break;
            default:
                days = 0;
                break;
        }
        return days;
    }

    //返回当月星期天数		heyh
    public static int getSundays(int year, int month) {
        int sundays = 0;
        SimpleDateFormat sdf = new SimpleDateFormat("EEEE");
        Calendar setDate = Calendar.getInstance();
        //从第一天开始
        int day;
        for (day = 1; day <= getDays(year, month); day++) {
            setDate.set(Calendar.DATE, day);
            String str = sdf.format(setDate.getTime());
            if (str.equals("星期日")) {
                sundays++;
            }
        }
        return sundays;
    }

    /**
     * 取得当月天数
     * heyh
     */
    public static int getCurrentMonthLastDay() {
        Calendar a = Calendar.getInstance();
        a.set(Calendar.DATE, 1);//把日期设置为当月第一天
        a.roll(Calendar.DATE, -1);//日期回滚一天，也就是最后一天
        int maxDate = a.get(Calendar.DATE);
        return maxDate;
    }

    /**
     * 得到指定月的天数
     */
    public static int getMonthLastDay(int year, int month) {
        Calendar a = Calendar.getInstance();
        a.set(Calendar.YEAR, year);
        a.set(Calendar.MONTH, month - 1);
        a.set(Calendar.DATE, 1);//把日期设置为当月第一天
        a.roll(Calendar.DATE, -1);//日期回滚一天，也就是最后一天
        int maxDate = a.get(Calendar.DATE);
        return maxDate;
    }


    /**
     * 获取当前斜线格式化时间 20160101
     *
     * @return
     */
    public static String getStringFormatDate() {
        return DateUtil.getFormatDate(new Date(), DateUtil.DATE_FORMAT_STR);
    }

    /**
     * 获取当前斜线格式化时间 2015/01/01
     *
     * @return
     */
    public static String getBaseFormatDate() {
        return DateUtil.getFormatDate(new Date(), DateUtil.DATE_FORMAT_BASE);
    }

    /**
     * 获取当前斜线格式化时间 2015-01-01
     *
     * @return
     */
    public static String getReduceFormatDate() {
        return DateUtil.getFormatDate(new Date(), DateUtil.DATE_FORMAT_REDUCE);
    }

    /**
     * 获取当前斜线格式化时间 2015-01
     *
     * @return
     */
    public static String getCurrentYearAndMonth() {
        return DateUtil.getFormatDate(new Date(), "yyyy-MM");
    }

    /**
     * 获取当前斜线格式化时间 2015-01-01
     *
     * @return
     */
    public static String getWeekFormatDate() {
        return DateUtil.getFormatDate(DateUtil.getAgoSeveralDays(new Date(), 7), DateUtil.DATE_FORMAT_REDUCE);
    }

    /**
     * 获取当前斜线格式化时间 2015/01/01/01/01
     *
     * @return
     */
    public static String getBiasFormatDate() {
        return DateUtil.getFormatDate(new Date(), DateUtil.DATE_FORMAT_BIAS);
    }

    /**
     * 获取当前冒号格式化时间 2015:01:01 01:01:59
     *
     * @return
     */
    public static String getColonFormatDate() {
        return DateUtil.getFormatDate(new Date(), DateUtil.DATE_FORMAT_COLON);
    }

    /**
     * 获取当前减号号格式化时间 2015-01-01 01:01:59
     *
     * @return
     */
    public static String getMinusFormatDate() {
        return DateUtil.getFormatDate(new Date(), DateUtil.DATE_FORMAT_MINUS);
    }

    /**
     * 获取当前减号号格式化时间 2015-01-01 01:01:59
     *
     * @return
     */
    public static String getMinusFormatDate(Date date) {
        return DateUtil.getFormatDate(date, DateUtil.DATE_FORMAT_MINUS);
    }

    /**
     * 获取当前减号号格式化时间 2015-01-01 01:01:59
     *
     * @return
     */
    public static String getMinusFormatDate(long value) {
        return DateUtil.getFormatDate(new Date(value), DateUtil.DATE_FORMAT_MINUS);
    }

    /**
     * 获取数字时间串 20150101010101
     *
     * @return
     */
    public static String getNumberFormatDate() {
        return DateUtil.getFormatDate(new Date(), DateUtil.DATE_FORMAT_NUMBER);
    }

    /**
     * 获取指定时间几分钟后的时间
     *
     * @param date
     * @param minutes
     * @return
     */
    public static Date getAfterSeveralMinutes(Date date, int minutes) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.add(Calendar.MINUTE, minutes);
        return calendar.getTime();
    }

    /**
     * 获取指定时间几月后的时间
     *
     * @param date
     * @param month
     * @return
     */
    public static Date getAfterSeveralMonth(Date date, int month) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.add(Calendar.MONTH, month);
        return calendar.getTime();
    }

    /**
     * 获取指定时间几年后的时间
     *
     * @param date
     * @param year
     * @return
     */
    public static Date getAfterSeveralYear(Date date, int year) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.add(Calendar.YEAR, year);
        return calendar.getTime();
    }

    /**
     * 获取几天前的时间
     *
     * @param date
     * @param day
     * @return
     */
    public static Date getAgoSeveralDays(Date date, int day) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.set(Calendar.DATE, calendar.get(Calendar.DATE) - day);
        return calendar.getTime();
    }

    /**
     * 获取几天后的时间
     *
     * @param date
     * @param day
     * @return
     */
    public static Date getAfterSeveralDays(Date date, int day) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.set(Calendar.DATE, calendar.get(Calendar.DATE) + day);
        return calendar.getTime();
    }

    /**
     * 获取几个月前的时间
     *
     * @param date
     * @param month
     * @return
     */
    public static String getAgoSeveralMonths(Date date, int month) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.set(Calendar.MONTH, calendar.get(Calendar.MONTH) - 5);
        calendar.set(Calendar.DATE, 1);
        return DateUtil.formatDate(calendar.getTime(), DateUtil.DATE_FORMAT_REDUCE);
    }

    /**
     * 获取上周一
     *
     * @param date
     * @return
     */
    public static Date getLastWeekMonday(Date date) {
        Date a = DateUtils.addDays(date, -1);
        Calendar cal = Calendar.getInstance();
        cal.setTime(a);
        cal.add(Calendar.WEEK_OF_YEAR, -1);
        cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
        return cal.getTime();
    }

    /**
     * 获取上周日
     *
     * @param date
     * @return
     */
    public static Date getLastWeekSunday(Date date) {
        Date a = DateUtils.addDays(date, -1);
        Calendar cal = Calendar.getInstance();
        cal.setTime(a);
        cal.set(Calendar.DAY_OF_WEEK, 1);
        return cal.getTime();
    }






    /*

     * 将时间戳转换为时间

     */


    /**
     * 方法功能说明： 自定义格式将字符串转换成日期
     * 创建：2016-10-8 by 焦丽娜
     * 修改：日期 by 修改者
     * 修改内容：
     *
     * @return Date
     * @throws
     * @参数： @param dateStr 日期字符串
     * @参数： @param format  格式
     * @参数： @return
     */
    public static Date getDateByBaseStr(String dateStr, String format) {
        SimpleDateFormat formatter = new SimpleDateFormat(format);
        Date dDate = null;
        try {
            dDate = formatter.parse(dateStr);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return dDate;
    }

    /**
     * 只保留yyyy-MM-dd精度
     *
     * @param date 日期
     * @return
     */
    public static Date getDateFormatReduce(Date date) {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(DATE_FORMAT_REDUCE);
        String sDate = simpleDateFormat.format(date);
        Date returnDate = null;
        try {
            returnDate = simpleDateFormat.parse(sDate);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return returnDate;
    }

    /**
     * 获取指定时间几分钟后的时间
     *
     * @param date
     * @param minutes
     * @return
     */
    public static String getTimestampString(Timestamp timestamp, String format) {
        return DateUtil.getFormatDate(new Date(timestamp.getTime()), format);
    }

    public static String getLastDayOfMonth(int year, int month) {
        Calendar cal = Calendar.getInstance();
        //设置年份
        cal.set(Calendar.YEAR, year);
        //设置月份
        cal.set(Calendar.MONTH, month - 1);
        //获取某月最大天数
        int lastDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
        //设置日历中月份的最大天数
        cal.set(Calendar.DAY_OF_MONTH, lastDay);
        //格式化日期
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");
        String lastDayOfMonth = sdf.format(cal.getTime());
        return lastDayOfMonth;
    }

    /*
     * 将时间戳转换为时间
     */
    public static String stampToDate(String s) {
        String res;
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        long lt = new Long(s);
        Date date = new Date(lt);
        res = simpleDateFormat.format(date);
        return res;
    }


    /**
     * 71    * 将长时间格式字符串转换为时间 yyyy-MM-dd HH:mm:ss
     * 72    *
     * 73    * @param strDate
     * 74    * @return
     * 75
     */
    public static Date strToDateLong(String strDate) {
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        ParsePosition pos = new ParsePosition(0);
        Date strtodate = formatter.parse(strDate, pos);
        return strtodate;
    }

    /**
     * 功能：获取当前时间往前倒秒</br>
     * 作者：zhanglongdeng@163.com </br>
     * 时间：2019年2月20日 下午5:41:17 </br>
     */
    public static String getCurrentDate4Minus(int seconds) {
        //正数代表当前时间往前，ChronoUnit里面有年、月、日等计量，根据需求可以修改
        LocalDateTime ldt = LocalDateTime.now().minus(seconds, ChronoUnit.SECONDS);
        Date date = Date.from(ldt.atZone(ZoneId.systemDefault()).toInstant());
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        return sdf.format(date);
    }

    /**
     * 功能：获取指定字符串时间之间的时间</br>
     * 作者：zhanglongdeng@163.com </br>
     * 时间：2019年2月27日 下午5:38:22 </br>
     */
    public static String getLimitDate4Minus(String datestr, int seconds) {
        Date date = DateUtil.getDateByBaseStr(datestr, DateUtil.DATE_FORMAT_MINUS);
        Date befor = new Date(date.getTime() - seconds * 1000);//60秒前的时间
        return DateUtil.getFormatDate(befor, DateUtil.DATE_FORMAT_MINUS);
    }

    /**
     * 功能：将秒转化成xx小时xx分钟xx秒</br>
     * 作者：wr </br>
     * 时间：2019年8月23日 下午3:03:22 </br>
     */
    public static String intToMinutesAndSeconds(int seconds) {
        return seconds / 3600 + "时" + (seconds % 3600) / 60 + "分" + (seconds % 3600) % 60 + "秒";
    }

    /**
     * 功能：获取某月的天数</br>
     * 作者：wr </br>
     * 时间：2019年9月11日 上午9:03:22 </br>
     */
    public static int getDaysOfMonth(Date date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        return calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
    }

    /**
     * 功能：时间相减得到天数</br>
     * 作者：wr </br>
     * 时间：2020年10月13日 下午14:04:49 </br>
     */
    public static long getDaySub(Date beginDate, Date endDate) {
        return (endDate.getTime() - beginDate.getTime()) / (24 * 60 * 60 * 1000);
    }

    /**
     * 功能：时间相减得到天数，只保留yyyy-MM-dd精度</br>
     * 作者：wr </br>
     * 时间：2020年10月13日 下午14:04:49 </br>
     */
    public static long getDaySubFormatReduce(Date beginDate, Date endDate) {
        beginDate = getDateFormatReduce(beginDate);
        endDate = getDateFormatReduce(endDate);
        return (endDate.getTime() - beginDate.getTime()) / (24 * 60 * 60 * 1000);
    }

    /**
     * 功能：时间相减得到秒数</br>
     * 作者：wr </br>
     * 时间：2020年10月13日 下午14:04:49 </br>
     */
    public static long getSecondSub(Date beginDate, Date endDate) {
        return (endDate.getTime() - beginDate.getTime()) / 1000;
    }


    public static void main(String[] args) throws ParseException {
//		Date DateMount = DateUtil.getAfterSeveralMinutes(new Date(), 4);
//		System.out.println(DateMount);
//		System.out.println(DateUtil.getNumberFormatDate());
//		System.out.println(DateUtil.getStringFormatDate());
//		String date1 = DateUtil.getAgoSeveralMonths(new Date(), 5);
//		System.out.println(date1);
//		System.out.println(DateUtil.getAfterSeveralMonth(new Date(), 2));
//		System.out.println(DateUtil.getAfterSeveralYear(new Date(), 2));
//		System.out.println(DateUtil.getLastDayOfMonth(2017, 2));


//		System.out.println("今天日期是：" + DateUtil.getNowDate());
//		System.out.println("本月有" + DateUtil.getDays(DateUtil.getYear(), DateUtil.getMonth()) + "天");
//		System.out.println("本月有" + DateUtil.getSundays(DateUtil.getYear(), DateUtil.getMonth()) + "个星期天");
//		System.out.println(DateUtil.getCurrentMonthLastDay());
//		System.out.println(DateUtil.getMonthLastDay(2017, 10));

//		SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
//		Calendar calendar = sdf.getCalendar();
//		calendar.setTime(sdf.parse(sdf.format(new Date())));
//		
//		int day=calendar.get(Calendar.DAY_OF_WEEK) - 1 == 0 ? 7 : calendar.get(Calendar.DAY_OF_WEEK) - 1;
//		calendar.set(Calendar.DATE, calendar.get(Calendar.DATE)-(day-1));
//		
//		Date startDate = calendar.getTime();//本周开始时间
//		calendar.set(Calendar.DATE, calendar.get(Calendar.DATE)+6);
//		Date endDate = calendar.getTime();//本周结束时间
//		
//		System.out.println("本周开始时间"+sdf.format(startDate));
//		System.out.println("本周结束时间"+sdf.format(endDate));
//		

//		SimpleDateFormat sdf=new SimpleDateFormat("MM-dd");
//		Calendar calendar = sdf.getCalendar();
//		int march = calendar.get(Calendar.MARCH);
//		calendar.set(Calendar.MARCH, march-1);
//		calendar.set(Calendar.DAY_OF_MONTH,calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
//		Date strDate = calendar.getTime();
//		System.out.println("上个月的最后一天"+sdf.format(strDate));


//		SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd");
//		Calendar c = Calendar.getInstance();    
//       c.add(Calendar.MONTH, 0);
//       c.set(Calendar.DAY_OF_MONTH,1);//设置为1号,当前日期既为本月第一天 
//       String first = format.format(c.getTime());
//       //获取当前月最后一天
//       Calendar ca = Calendar.getInstance();    
//       ca.set(Calendar.DAY_OF_MONTH, ca.getActualMaximum(Calendar.DAY_OF_MONTH));  
//       String last = format.format(ca.getTime());
//       System.out.println("===============本月first day:"+first);
//       System.out.println("===============本月last day:"+last);


        //1509326781000
        //String res;
//        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//        long lt = new Long("1509326781000");
//        Date date = new Date(lt);
//        String res = simpleDateFormat.format(date);
//        System.out.println(res);
//
//        Date now = new Date();
//        long time = 60 * 1000;//60秒
//        Date afterDate = new Date(now.getTime() + time);//60秒后的时间
//        Date beforeDate = new Date(now.getTime() - time);//60秒前的时间
//        System.out.println(now.getTime());
//        System.out.println(afterDate.getTime());
//        System.out.println(beforeDate.getTime());
//
//        String datestr = "2017-10-30 09:26:21";
//        Date dd = DateUtil.getDateByBaseStr(datestr, DateUtil.DATE_FORMAT_MINUS);
//
//        long time1 = 10 * 1000;//10秒
//
//        Date ad = new Date(dd.getTime() + time1);//60秒后的时间
//        Date bd = new Date(dd.getTime() - time1);//60秒前的时间
//
//        System.out.println(DateUtil.getFormatDate(ad, DateUtil.DATE_FORMAT_MINUS));
//        System.out.println(DateUtil.getFormatDate(bd, DateUtil.DATE_FORMAT_MINUS));
//
//        System.out.println(DateUtil.getLimitDate4Minus(datestr, 3));

        System.out.println(getDaySub(new Date(), DateUtil.getDateByBaseStr("2020-10-13 14:10:21", DateUtil.DATE_FORMAT_MINUS)));
        System.out.println(getSecondSub(new Date(), DateUtil.getDateByBaseStr("2020-10-13 14:10:21", DateUtil.DATE_FORMAT_MINUS)));
    }

}
